//
//  FRPAppDelegate.m
//  FRP
//
//  Created by Ash Furrow on 10/13/2013.
//  Copyright (c) 2013 Ash Furrow. All rights reserved.
//

/**
 1. MVVM架构模式简介

 MVVM是一种将应用程序分为三个部分的架构模式：Model、View和ViewModel。

 每个部分都有其独立的职责，使代码更易于理解和维护。

 Model：负责处理数据和业务逻辑，可以是数据模型、网络请求或数据库操作等。

 iew：负责展示用户界面，与用户交互，并将用户的操作反馈给ViewModel。

 ViewModel：连接Model和View，负责管理数据和业务逻辑的状态，并将数据绑定到View上。

 MVVM的核心思想是数据驱动视图，通过双向数据绑定实现Model和View之间的同步更新。

 这种数据绑定方式可以减少大量的手动UI更新代码，提高开发效率和代码可读性。

 2. ReactiveCocoa简介

 ReactiveCocoa（RAC）是一个流行的响应式编程框架，它提供了一套用于处理事件流和数据绑定的函数式编程工具。

 RAC能够与MVVM架构完美结合，使得开发者可以使用函数响应式编程的方式来处理数据和事件。

 RAC的核心概念是信号（Signal）和订阅（Subscription）。

 信号表示一系列的事件，可以是用户的交互、网络请求结果等。

 通过订阅信号，可以响应事件的发生并做出相应的处理。

 3. MVVM+RAC实战步骤

 下面是在iOS开发中应用MVVM+RAC的实战步骤：

 步骤1：准备工作

 引入ReactiveCocoa库到项目中，并在需要的地方导入ReactiveCocoa头文件。

 设计合适的数据模型和视图模型，根据业务需求定义属性和方法。

 步骤2：视图绑定

 在View中创建相应的控件，并通过RAC提供的方法将控件和ViewModel中的属性进行绑定。

 当ViewModel中的属性发生变化时，控件的值将自动更新。

 步骤3：事件处理

 在View中处理用户的交互事件，并将事件发送给ViewModel处理。

 ViewModel通过RAC的信号机制订阅这些事件，并进行相应的处理和逻辑操作。

 步骤4：数据绑定

 在ViewModel中获取数据并将其绑定到View中的相应控件上。

 当数据发生变化时，控件将自动更新显示最新的数据。

 步骤5：网络请求和异步操作

 在ViewModel中处理网络请求和异步操作，并使用RAC提供的方法来管理和处理异步操作的结果。

 通过信号的方式将请求结果返回给View，并进行相应的处理。

 步骤6：测试与调试

 使用单元测试来验证ViewModel的逻辑和功能是否正常。

 使用调试工具来跟踪信号的传递和事件的处理，确保代码的正确性和性能。

 */

#import "FRPAppDelegate.h"

#import "FRPGalleryViewController.h"

@interface FRPAppDelegate ()

@property (nonatomic, strong) PXAPIHelper *apiHelper;

@end

@implementation FRPAppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    NSString *consumerKey = @"DC2To2BS0ic1ChKDK15d44M42YHf9gbUJgdFoF0m";
    NSString *consumerSecret = @"i8WL4chWoZ4kw9fh3jzHK7XzTer1y5tUNvsTFNnB";
    
    [PXRequest setConsumerKey:consumerKey consumerSecret:consumerSecret];
    
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:[[FRPGalleryViewController alloc] init]];
    
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

- (void)applicationWillResignActive:(UIApplication *)application
{
    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 
    // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background.
}

- (void)applicationDidBecomeActive:(UIApplication *)application
{
    // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.
}

@end
